home *** CD-ROM | disk | FTP | other *** search
/ NeXT Education Software Sampler 1992 Fall / NeXT Education Software Sampler 1992 Fall.iso / Programming / Source / WAIS / ir / ztype1.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-02-02  |  7.5 KB  |  319 lines

  1. /* WIDE AREA INFORMATION SERVER SOFTWARE:
  2.    No guarantees or restrictions.  See the readme file for the full standard
  3.    disclaimer.    
  4.   
  5.    3.26.90    Harry Morris, morris@think.com
  6.    4.11.90  HWM - generalized conditional includes (see c-dialect.h)
  7. */
  8.  
  9. #define _C_Type_1_Query_
  10.  
  11. #include "ztype1.h"
  12. #include "cutil.h"
  13. #include "panic.h"
  14. #include <string.h>
  15.  
  16. #ifndef ANSI_LIKE
  17. #include "ustubs.h"
  18. #endif
  19.  
  20. /*----------------------------------------------------------------------*/
  21.  
  22. query_term*
  23. makeAttributeTerm(use,
  24.           relation,
  25.           position,
  26.           structure,
  27.           truncation,
  28.           completeness,
  29.           term)
  30. char* use;
  31. char* relation;
  32. char* position;
  33. char* structure;
  34. char* truncation;
  35. char* completeness;
  36. any* term;
  37. {
  38.   query_term* qt = (query_term*)s_malloc((size_t)sizeof(query_term));
  39.  
  40.   qt->TermType = TT_Attribute;
  41.  
  42.   /* copy in the attributes */
  43.   strncpy(qt->Use,use,ATTRIBUTE_SIZE);
  44.   strncpy(qt->Relation,relation,ATTRIBUTE_SIZE);
  45.   strncpy(qt->Position,position,ATTRIBUTE_SIZE);
  46.   strncpy(qt->Structure,structure,ATTRIBUTE_SIZE);
  47.   strncpy(qt->Truncation,truncation,ATTRIBUTE_SIZE);
  48.   strncpy(qt->Completeness,completeness,ATTRIBUTE_SIZE);
  49.  
  50.   qt->Term = duplicateAny(term);
  51.  
  52.   qt->ResultSetID = NULL;
  53.  
  54.   return(qt);
  55. }
  56.  
  57. /*----------------------------------------------------------------------*/
  58.  
  59. query_term*
  60. makeResultSetTerm(resultSet)
  61. any* resultSet;
  62.   query_term* qt = (query_term*)s_malloc((size_t)sizeof(query_term));
  63.  
  64.   qt->TermType = TT_ResultSetID;
  65.  
  66.   qt->ResultSetID = duplicateAny(resultSet);
  67.  
  68.   qt->Term = NULL;
  69.   
  70.   return(qt);
  71. }
  72.  
  73. /*----------------------------------------------------------------------*/
  74.  
  75. query_term* 
  76. makeOperatorTerm(operatorCode)
  77. char* operatorCode;
  78. {
  79.   query_term* qt = (query_term*)s_malloc((size_t)sizeof(query_term));
  80.  
  81.   qt->TermType = TT_Operator;
  82.  
  83.   strncpy(qt->Operator,operatorCode,OPERATOR_SIZE);
  84.  
  85.   qt->Term = NULL;
  86.   qt->ResultSetID = NULL;
  87.  
  88.   return(qt);
  89. }
  90.  
  91. /*----------------------------------------------------------------------*/
  92.  
  93. void 
  94. freeTerm(qt)
  95. query_term* qt;
  96. {
  97.   switch (qt->TermType)
  98.     { case TT_Attribute:
  99.     freeAny(qt->Term);
  100.     break;
  101.       case TT_ResultSetID:
  102.     freeAny(qt->ResultSetID);
  103.     break;
  104.       case TT_Operator:
  105.     /* do nothing */
  106.     break;
  107.       default:
  108.     panic("Implementation error: Unknown term type %ld",
  109.           qt->TermType);
  110.     break;
  111.       }
  112.   s_free(qt);
  113. }
  114.  
  115. /*----------------------------------------------------------------------*/
  116.  
  117. #define ATTRIBUTE_LIST_SIZE    ATTRIBUTE_SIZE * 6
  118. #define AT_DELIMITER    " "
  119.  
  120. char* 
  121. writeQueryTerm(qt,buffer,len)
  122. query_term* qt;
  123. char* buffer;
  124. long* len;
  125. {
  126.   char* buf = buffer;
  127.   char attributes[ATTRIBUTE_LIST_SIZE];
  128.  
  129.   switch (qt->TermType)
  130.     { case TT_Attribute:
  131.     strncpy(attributes,qt->Use,ATTRIBUTE_LIST_SIZE); 
  132.     s_strncat(attributes,AT_DELIMITER,sizeof(AT_DELIMITER) + 1,ATTRIBUTE_LIST_SIZE);
  133.     s_strncat(attributes,qt->Relation,ATTRIBUTE_SIZE,ATTRIBUTE_LIST_SIZE); 
  134.     s_strncat(attributes,AT_DELIMITER,sizeof(AT_DELIMITER) + 1,ATTRIBUTE_LIST_SIZE);
  135.     s_strncat(attributes,qt->Position,ATTRIBUTE_SIZE,ATTRIBUTE_LIST_SIZE); 
  136.     s_strncat(attributes,AT_DELIMITER,sizeof(AT_DELIMITER) + 1,ATTRIBUTE_LIST_SIZE);
  137.     s_strncat(attributes,qt->Structure,ATTRIBUTE_SIZE,ATTRIBUTE_LIST_SIZE); 
  138.     s_strncat(attributes,AT_DELIMITER,sizeof(AT_DELIMITER) + 1,ATTRIBUTE_LIST_SIZE);
  139.     s_strncat(attributes,qt->Truncation,ATTRIBUTE_SIZE,ATTRIBUTE_LIST_SIZE); 
  140.     s_strncat(attributes,AT_DELIMITER,sizeof(AT_DELIMITER) + 1,ATTRIBUTE_LIST_SIZE);
  141.     s_strncat(attributes,qt->Completeness,ATTRIBUTE_SIZE,ATTRIBUTE_LIST_SIZE);
  142.     buf = writeString(attributes,DT_AttributeList,buf,len);
  143.     buf = writeAny(qt->Term,DT_Term,buf,len);
  144.     break;
  145.       case TT_ResultSetID:
  146.     buf = writeAny(qt->ResultSetID,DT_ResultSetID,buf,len);
  147.     break;
  148.       case TT_Operator:
  149.     buf = writeString(qt->Operator,DT_Operator,buf,len);
  150.     break;
  151.       default:
  152.     panic("Implementation error: Unknown term type %ld",
  153.           qt->TermType);
  154.     break;
  155.       }
  156.  
  157.   return(buf);
  158. }
  159.  
  160. /*----------------------------------------------------------------------*/
  161.  
  162. char* 
  163. readQueryTerm(qt,buffer)
  164. query_term** qt;
  165. char* buffer;
  166. {
  167.   char* buf = buffer;
  168.   char  *attributeList = NULL;
  169.   char* operator = NULL;
  170.   any*     term;
  171.   char* use = NULL;
  172.   char* relation = NULL;
  173.   char* position = NULL;
  174.   char* structure = NULL;
  175.   char* truncation = NULL;
  176.   char* completeness;
  177.   any*    resultSetID = NULL;
  178.   data_tag tag;
  179.  
  180.   
  181.   tag = peekTag(buffer);
  182.  
  183.   switch(tag)
  184.     { case DT_AttributeList:
  185.     buf = readString(&attributeList,buf);
  186.     buf = readAny(&term,buf);
  187.     use = strtok(attributeList,AT_DELIMITER);
  188.     relation = strtok(NULL,AT_DELIMITER);
  189.     position = strtok(NULL,AT_DELIMITER);
  190.     structure = strtok(NULL,AT_DELIMITER);
  191.     truncation = strtok(NULL,AT_DELIMITER);
  192.     completeness = strtok(NULL,AT_DELIMITER);
  193.     *qt = makeAttributeTerm(use,relation,position,structure,
  194.                 truncation,completeness,term);
  195.     s_free(attributeList);
  196.     freeAny(term);
  197.     break;
  198.       case DT_ResultSetID:
  199.     buf = readAny(&resultSetID,buf);
  200.     *qt = makeResultSetTerm(resultSetID);    
  201.     freeAny(resultSetID);
  202.     break;
  203.       case DT_Operator:
  204.     buf = readString(&operator,buf);
  205.     *qt = makeOperatorTerm(operator);
  206.     s_free(operator);
  207.     break;
  208.       default:
  209.     REPORT_READ_ERROR(buf);
  210.     break;
  211.       }
  212.   
  213.   return(buf);
  214. }
  215.  
  216. /*----------------------------------------------------------------------*/
  217.  
  218. static unsigned long getQueryTermSize _AP((query_term* qt));
  219.  
  220. static unsigned long
  221. getQueryTermSize(qt)
  222. query_term* qt;
  223. /* figure out how many bytes it will take to write this query */
  224. {
  225.   unsigned long size;
  226.   static char attributes[] = "11 22 33 44 55 66"; /* we just need this to 
  227.                              calculate its written
  228.                              size */
  229.  
  230.   switch (qt->TermType)
  231.     { case TT_Attribute:
  232.     size = writtenStringSize(DT_AttributeList,attributes);
  233.     size += writtenAnySize(DT_Term,qt->Term);
  234.     break;
  235.       case TT_ResultSetID:
  236.     size = writtenAnySize(DT_ResultSetID,qt->ResultSetID);
  237.     break;
  238.       case TT_Operator:
  239.     size = writtenStringSize(DT_Operator,qt->Operator);
  240.     break;
  241.       default:
  242.     panic("Implementation error: Unknown term type %ld",
  243.           qt->TermType);
  244.     break;
  245.       }
  246.  
  247.   return(size);
  248. }
  249.  
  250. /*----------------------------------------------------------------------*/
  251.  
  252. /* A query is simply a null terminated list of query terms. For 
  253.    transmission, a query is written into an any which is sent as
  254.    the user information field. */
  255.  
  256. any*
  257. writeQuery(terms)
  258. query_term** terms;
  259. {
  260.   any* info = NULL;
  261.   char* writePos = NULL;
  262.   char* data = NULL;
  263.   unsigned long size = 0;
  264.   long remaining = 0;
  265.   long i;
  266.   query_term* qt = NULL;
  267.  
  268.   if (terms == NULL)
  269.     return(NULL);
  270.  
  271.   /* calculate the size of write buffer */
  272.   for (i = 0,qt = terms[i]; qt != NULL; qt = terms[++i])
  273.     size += getQueryTermSize(qt);
  274.  
  275.   data = (char*)s_malloc((size_t)size);
  276.  
  277.   /* write the terms */
  278.   writePos = data;
  279.   remaining = size;
  280.   for (i = 0,qt = terms[i]; qt != NULL; qt = terms[++i])
  281.     writePos = writeQueryTerm(qt,writePos,&remaining);
  282.  
  283.   info = makeAny(size,data);
  284.  
  285.   return(info);
  286. }
  287.  
  288. /*----------------------------------------------------------------------*/
  289.  
  290. query_term**
  291. readQuery(info)
  292. any *info;
  293. {
  294.   char* readPos = info->bytes;
  295.   query_term** terms = NULL;
  296.   query_term* qt = NULL;
  297.   long numTerms = 0;
  298.  
  299.  
  300.   while (readPos < info->bytes + info->size)
  301.     { readPos = readQueryTerm(&qt,readPos);
  302.       if (terms == NULL)
  303.     { terms = (query_term**)s_malloc((size_t)(sizeof(query_term*)*2));
  304.     }
  305.       else
  306.     { terms = 
  307.         (query_term**)s_realloc((char*)terms,
  308.                     (size_t)(sizeof(query_term*)*(numTerms+2)));
  309.       }
  310.       terms[numTerms++] = qt;
  311.       terms[numTerms] = NULL;
  312.     }
  313.  
  314.   return(terms);
  315. }
  316.  
  317. /*----------------------------------------------------------------------*/
  318.